#pragma once

#include <iosfwd>
#include <exception>
#include <string>
#include <sstream>

namespace  ckr
{
class Context;


class AssertableValueCString
{
public:

	AssertableValueCString(	const char*		valueIn,
									const char*		valueName,
									Context&			callerIn,
									int				lineNumberIn,
									const char*		srcFileNameIn );

	AssertableValueCString(	const std::string&	valueIn,
									const char*				valueName,
									Context&					callerIn,
									int						lineNumberIn,
									const char*				srcFileNameIn );

	AssertableValueCString& should_be;

	void operator==(const char* rhs);
	void operator!=(const char* rhs);

	void operator<(const char* rhs);
	void operator<=(const char* rhs);

	void operator>(const char* rhs);
	void operator>=(const char* rhs);

	void should_equal_impl( const char* other, const char* otherName );
	// use SHOULD_EQUAL macro instead of calling this directly.

	void should_not_equal_impl( const char* other, const char* otherName ); 
	// use SHOULD_NOT_EQUAL macro instead of calling this directly.

	void should_be_less_than_impl( const char* other, const char* otherName );
	// use SHOULD_BE_LESS_THAN macro instead of calling this directly.

	void should_be_less_than_or_equal_to_impl( const char* other, const char* otherName );
	// use SHOULD_BE_LESS_THAN_OR_EQUAL_TO macro instead of calling this directly.

	void should_be_greater_than_impl( const char* other, const char* otherName );
	// use SHOULD_BE_GREATER_THAN_ macro instead of calling this directly.

	void should_be_greater_than_or_equal_to_impl( const char* other, const char* otherName );
	// use SHOULD_BE_GREATER_THAN_OR_EQUAL_TO macro instead of calling this directly.

	void should_be_between_impl( 
							const char*		lowValueIn,
							const char*		lowValueNameIn, 
							const char*		highValueIn,
							const char*		highValueNameIn );
	// use SHOULD_BE_BETWEEN macro instead of calling this directly.

	void should_not_be_between_impl( 
							const char*		lowValueIn,
							const char*		lowValueNameIn, 
							const char*		highValueIn,
							const char*		highValueNameIn );
	// use SHOULD_NOT_BE_BETWEEN macro instead of calling this directly.

	void should_be_within_impl( 
							const char *	lowValueIn,
							const char *	lowValueNameIn, 
							const char *	highValueIn,
							const char *	highValueNameIn );

	void should_not_be_within_impl( 
							const char *	lowValueIn,
							const char *	lowValueNameIn, 
							const char *	highValueIn,
							const char *	highValueNameIn );

private:	

	const char*		value;
	Context&			caller;
	const char*		valueName;
	int				lineNumber;
	const char*		srcFileName;
};

}; // end namespace

